package code

import "fmt"

func Concurrence4() {
	// 像队列 先进先出
	var ch1 chan int
	fmt.Println("ch1=", ch1)
}

func Concurrence5() {
	// 像队列 先进先出
	// 第二个参数, 是缓冲大小即队列大小
	ch1 := make(chan int, 1)
	// 如果channel大小是0, 如果没有接收, 函数会堵塞死锁
	ch1 <- 10
	x := <-ch1
	fmt.Println(x)
	// 如果close channel则不能在做发送(写)操作
	close(ch1)
	// channel已经关闭, 代码会报错
	// ch1 <- 20
}

// 取值方式
// 第一种
func concurrenceChannle1() {
	ch1 := make(chan int)
	go func() {
		for i := 0; i < 100; i++ {
			ch1 <- i
		}
		close(ch1)
	}()
	for {
		x, ok := <-ch1
		if !ok {
			break
		}
		fmt.Println(x)
	}
}

// 第二种
func concurrenceChannle2() {
	ch1 := make(chan int)
	go func() {
		for i := 0; i < 100; i++ {
			ch1 <- i
		}
		close(ch1)
	}()
	// 通过关闭后会退出for range会自动退出
	for x := range ch1 {
		fmt.Println(x)
	}
}

// 第三种
func concurrenceChannle3() {
	ch1 := make(chan int)
	go func() {
		for i := 0; i < 100; i++ {
			ch1 <- i
		}
		close(ch1)
	}()
	for {
		select {
		case x, ok := <-ch1:
			if !ok {
				return
			}
			fmt.Println(x)
		default:
			fmt.Println("default")
		}
	}
}
